package com.itheima.reggie.common;


import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.sql.SQLException;

/**
 * 全局异常处理器
 * @ControllerAdvice : 指定拦截那些类型的控制器;
 * @ResponseBody : 将方法的返回值 R 对象转换为json格式的数据, 响应给页面;
 * @RestControllerAdvice = @ResponseBody+@ControllerAdvice
 * @ExceptionHandler : 定义一个异常处理拦截器
 * @ExceptionHandler(SQLException.class) : 指定捕获的异常类型为SQLException
 */
@RestControllerAdvice
public class GlobalExceptionHandler {

    /**
     * 每一个方法处理一种类型的异常
     * SQLException : 处理sql异常
     * @param e 封装了错误信息
     * @return
     */
    @ExceptionHandler(SQLException.class)
    public R<String> doSQLException(SQLException e) {
        //打印异常信息
        e.printStackTrace();
        //获取异常信息
        String message = e.getMessage();
        //判断异常信息是哪种异常
        /**
         *  startsWith()以..开头
         *  startsWith("Duplicate entry") 判断异常是不是以 Duplicate entry 开头
         */
        if (message.startsWith("Duplicate entry")){
            //对异常信息进行截取,截取到具体的异常信息
            String s = message.split(" ")[2];
            //响应错误信息
            return R.error(s+"已存在");
        }
        /**
         *  contains()包含..
         *  contains("Data too long") 判断是否包含 Data too long
         */
        if (message.contains("Data too long")){
            //对异常信息进行截取,截取到具体的异常信息
            String s = message.split(" ")[7];
            //响应错误信息
            return R.error(s+"超出长度");
        }
        //响应错误信息
        return R.error("未知异常");
    }

    /**
     * 处理自定义异常
     * @param e 封装的是错误信息
     * @return 响应一个错误信息
     */
    @ExceptionHandler(CustomException.class)
    public R<String> doCustomException(CustomException e) {
        //将异常信息输出到控制台
        e.printStackTrace();
        //响应一个错误信息
        return R.error(e.getMessage());
    }

}
